/**
 * Defines method for calling remote server methods
 * @class ElggMap
 */
ElggMap.provide( '', {
	/**
	 * Llama a un método del servidor
	 *  Ahora las lalamadas son sincrónicas.
	 *  El método de la api devuelve un objecto JSON
	 *  Cualquier event que el servidor disparle lo maneja
	 *  esta fnción.
	 *   @param String method El metodo'a llamar en el servidor
	 *   @param Object methodParameters Parámetros extra para el método
	 *   @param Function La función a llamar cuando la llamada se complete
	 */
	api: function(method, methodParameters, callback)
	{

		var response, async, ret;
		
		// Habilito las llamadas asincrónicas si el argumento
		// callback es una funcón
		async = $.isFunction(callback) ? true : false;
	
		//incluyo el método como propiedad del objeto a mandar
		methodParameters = $.extend( methodParameters, { method: method } );

		if (async) {
			var response = jQuery.post( ELGG_MAPS_WEBPATH + 'json.php',
				methodParameters,
				function(response, statusText) {
					ElggMap._callHandler( response, statusText, callback );
				});
		} else {
			// Llamada sincrónica
			$.ajaxSetup({ async:false });
			var response = jQuery.post( ELGG_MAPS_WEBPATH + 'json.php', methodParameters );
			// jQuery.post devuelve un objeto jqXHR
			ret = ElggMap._callHandler(response.responseText, response.statusText, null);
			// Disable synchronous call
			$.ajaxSetup({ async:true });
		}
		
			
		// @todo volar esto cuando las llamadas sean completamente asincrónicas
		if (ret)
			return ret;
		
	},
	/**
	 * Renders a dialog from the server
	 * options must have this properties set
	 * <p>
	 *   Name				| Description												
	 * | ------------------ | --------------------------------------------------------- |
	 * | options.method		| The method to call on the server							|
	 * | options.selector	| The selector for the container that will hold the dialog	|
	 * --------------------------------------------------------------------------------
	 * </p>
	 * @param Object options Parameters for the call
	 * @callback Function callback for calling after the content loads
	 */
	apiDialog: function( options, callback )
	{
		var selector;
		if ( options.selector === undefined || $(options.selector).length === 0 ) {
			ElggMap.log( "apiDialog needs a valid selector as 'options for loading content" );
			return false;
		}
		selector = options.selector;
		delete options.selector;
		if ( options.method === undefined) {
			ElggMap.log( "apiDialog needs a valid 'method' property in options argument" );
		}

		$(	selector ).load( 
			ELGG_MAPS_WEBPATH + 'json.php',
			options,
			function() {
				// Disparo evento con el nombre del evento
				// y .show al final. Ej. dialog.map.getInfo.show
				// si options.method== 'dialog.map.getInfo'
				ElggMap.Event.fire(options.method+'.show');
				if ( $.isFunction(callback) ) {
					callback();
				}
			}
		);
	},
	_callHandler: function(response, statusText, callback)
	{
		if (statusText ===  'error' ) {
			ElggMap.log( "Error del servidor" );
			return false;
		}			
		// The call return the XHR object
		var ret = $.parseJSON( response );

		if ( !ret ) {
			ElggMap.log( "Couldn't parse server JSON response" );
			return false;
		}

		 //  Load the queued events that the server wants  to trigger
		if ( ( ret.events !== undefined ) && jQuery.isArray( ret.events ) ) {
			$.each( ret.events, function( i, event ) {
				ElggMap.Event.fire(event);
			});
		}

		 //  Log the queued message by the server
		if ( ( ret.log !== undefined ) && jQuery.isArray( ret.log ) ) {
			$.each( ret.log, function( i, message ) {
				ElggMap.log( message );
			});
		}
		
		if ( $.isFunction( callback ) ) {
			callback(ret);
		}
		
		if (ret)
			return ret;
	}
	
});
